package org.graduation.recruitment.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.graduation.recruitment.entity.dto.EnterpriseRegisterDTO;
import org.graduation.recruitment.entity.dto.UpdatePasswordDTO;
import org.graduation.recruitment.entity.dto.UserLoginDTO;
import org.graduation.recruitment.entity.pojo.EnterpriseUser;
import org.graduation.recruitment.service.EnterpriseUserService;
import org.graduation.recruitment.utils.ResponseResult;
import org.graduation.recruitment.utils.Token;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/enterprise")
@Tag(name = "企业用户接口", description = "提供企业用户相关的CRUD操作")
@Slf4j
@SecurityRequirement(name = "openApiSecurityScheme")
public class EnterpriseUserController {

    // 企业用户服务类的注入
    @Autowired
    private EnterpriseUserService enterpriseUserService;

    // Token工具类的注入
    @Autowired
    private Token token;

    /**
     * 企业注册接口
     *
     * @param dto 注册信息的数据传输对象
     * @return 注册成功返回成功信息，失败返回失败信息
     */
    @PostMapping("/register")
    @Operation(summary = "企业注册接口")
    public ResponseResult register(@RequestBody EnterpriseRegisterDTO dto) {
        //如果dto的email、name、unifiedSocialCreditCode、contactPerson、password有一个是空字符串就返回信息不全
        if (dto.getEmail().isBlank() || dto.getName().isBlank() || dto.getUnifiedSocialCreditCode().isBlank() || dto.getContactPerson().isBlank() || dto.getPassword().isBlank()) {
            return ResponseResult.fail("请将信息填写完整");
        }
        boolean flag = enterpriseUserService.register(dto);
        if (flag) {
            return ResponseResult.success();
        }
        log.warn("企业注册失败:" + dto);
        return ResponseResult.fail("注册失败");
    }

    /**
     * 企业登录接口
     *
     * @param dto 登录信息的数据传输对象
     * @return 登录成功返回成功信息和token，失败返回失败信息
     */
    @PostMapping("/login")
    @Operation(summary = "企业登录接口")
    public ResponseResult login(@RequestBody UserLoginDTO dto) {
        String token = enterpriseUserService.login(dto);
        if (token != null) {
            return ResponseResult.success(token);
        }
        return ResponseResult.fail("账号或密码错误");
    }

    /**
     * 企业通过自己的token获取自己信息接口
     *
     * @param tokenStr 企业用户的token字符串
     * @return 返回企业用户的信息，token错误返回失败信息
     */
    @GetMapping("/info")
    @Operation(summary = "企业通过token获取信息接口")
    public ResponseResult getUserInfo(@RequestHeader("Authorization") String tokenStr) {
        EnterpriseUser user = (EnterpriseUser) enterpriseUserService.getUserInfoByToken(tokenStr);
        if (user != null) {
            return ResponseResult.success(user);
        }
        return ResponseResult.fail("token错误");
    }

    /**
     * 企业信息接口
     *
     * @param enterprise_id 企业ID
     * @return 返回指定企业信息，企业不存在返回失败信息
     */
    @GetMapping("/info/{enterprise_id}")
    @Operation(summary = "获取企业信息接口")
    public ResponseResult getUserInfoById(@PathVariable Long enterprise_id) {
        EnterpriseUser user = (EnterpriseUser) enterpriseUserService.getUserInfoById(enterprise_id);
        if (user != null) {
            return ResponseResult.success(user);
        }
        return ResponseResult.fail("企业不存在");
    }

    /**
     * 企业修改信息接口
     *
     * @param enterpriseUser 企业用户信息对象
     * @param tokenStr       企业用户的token字符串
     * @return 修改成功返回成功信息，失败返回失败信息
     */
    @PostMapping("/update")
    @Operation(summary = "企业修改信息接口")
    public ResponseResult updateInfo(@RequestBody EnterpriseUser enterpriseUser, @RequestHeader("Authorization") String tokenStr) {
        Long uid = token.getUidByToken(tokenStr);
        if (!enterpriseUser.getId().equals(uid)) {
            return ResponseResult.fail("错误的id信息");
        } else {
            enterpriseUser.setId(uid);
        }
        if (enterpriseUserService.updateInfo(enterpriseUser)) {
            return ResponseResult.success();
        } else {
            return ResponseResult.fail("更新企业信息失败，请稍后再试");
        }
    }

    /**
     * 企业修改密码接口
     *
     * @param dto      修改密码的数据传输对象
     * @param tokenStr 企业用户的token字符串
     * @return 修改成功返回成功信息，失败返回失败信息
     */
    @PostMapping("/update/password")
    @Operation(summary = "企业修改密码接口")
    public ResponseResult updatePassword(@RequestBody UpdatePasswordDTO dto, @RequestHeader("Authorization") String tokenStr) {
        Long uid = token.getUidByToken(tokenStr);
        if (enterpriseUserService.updatePassword(uid, dto.getOldPassword(), dto.getNewPassword())) {
            return ResponseResult.success();
        } else {
            return ResponseResult.fail("更新密码失败，请稍后再试");
        }
    }
}
